import { PREVIEW } from "cc/env";
import { IStorageSecurity } from "./IStorageSecurity"; 
import { sys } from "cc";

export class StorageManager {

    private id:string = null!;//用于保存玩家id,
    private iis:IStorageSecurity = null!; //用于加密存储数据
    //本地存储初始化
    public init(iis:IStorageSecurity):void{
        this.iis = iis;
    }

    /**
	 * Preview in browser or simulator.
     * 数据加密开关，如果在浏览器 Preview 模式下，则不加密数据，否则加密数据。
	 */
    private get encrypted():boolean{
        return PREVIEW;
    }

    //获取加密后的key
    private getKey(key:string):string{
        //如果本地没有玩家，数据，则直接返回key
        if (this.id == null || this.id == "")  {
          return key;
        }
        //如果已有数据，则返回玩家id_key
        return  `${this.id}_${key}`
    }

    /**
     * 添加本地存储
    */
    public set(key:string, value:any){
        //获取key
        let keyWords = this.getKey(key);
        /**
         * null == key  || key == null 的区别在那？   
         * null == key  等价于 key == null，null 是一个特殊的对象，它不等于任何值，包括它自己。
        */
        if (null == key) {
            console.error("key不能为空");
            return;
        }
        //过掉value 为null 的数据 。
        if (null == value) {
            console.error("value不能为空");
            return;
        }
        //过掉value 为function 的数据 。
        if (typeof value == "function") {
            console.error("value不能为function");
            return;
        }
        //加密keyworkds
        if(this.encrypted){
            keyWords = this.iis.encrypt(keyWords)
        }

        if (typeof value == "object") {
            try {
                value = JSON.stringify(value);
            } catch (error) {
                console.error(" value 不能为对象");
                return;
            }
        }else if (typeof value == "number"){
            value = value+"";//将number 转为string,还好是ts 这要是js 只能是运行时报错了。 
        }

        if (this.encrypted) {
            //加密完key, 加密 value
            value  = this.iis.encrypt(value);
        }
        
        sys.localStorage.setItem(keyWords, value);

    }

    /**
     * 获取本地存储
    */
    public get(key:string,defaultValue:any = ""):string{
        if (null == key) {
            console.error("key不能为空");
            return null!;
        }
        key = this.getKey(key);
        //是否开启加密
        if (this.encrypted) {
            key = this.iis.encrypt(key);
        }
        //联合类型 string | null
        let value:string | null  = sys.localStorage.getItem(key)
        if (null!= value && '' != value && this.encrypted) {
            value = this.iis.decrypt(value)
        }
        if (null === value) {
            return defaultValue
        }
        return value;

    }

    /**
     * 根据Key 删除 本地存储
     */
    public remove(key:string):void{
        if(null == key){
            console.error("key不能为空");
            return;
        }
        let keyWords = this.getKey(key)
        if(this.encrypted){
            keyWords = this.iis.encrypt(keyWords)
        }
        sys.localStorage.removeItem(keyWords);
    }


    //删除所有本地存储
    public clear():void{
        sys.localStorage.clear();
    }




}